import type { Ref } from 'vue'
import type { MessageHandler, AlertProps } from 'element-plus'

export interface State {
    // 正在等待响应
    awaitResponse: boolean
    // 消息发送按钮loading
    sendMessageLoading: boolean
    // 消息输入框值
    messageInputValue: string
    system: {
        // 系统总开关
        switch: boolean
        // 后台运行锁定，比如在 /kefu 页面，锁定系统不能再切换到前台
        hideLock: boolean
    }
    // 悬浮固钉
    affix: {
        show: boolean
        disabled: boolean
    }
    // 新消息
    newMessage: {
        show: boolean
        disabled: boolean
        content: string
    }
    // 会话弹窗
    sessionDialog: {
        show: boolean
        // 搜索结果
        searchData: any[]
        // 搜索对话框
        searchDialog: boolean
        // 会话搜索
        searchSession: boolean
        // 搜索结果页码
        searchDataPage: number
        // 搜索结果是否还有下一页
        searchDataNextPage: boolean
        // 会话搜索关键词
        searchSessionKeyword: string
        // 窗口抖动
        shake: boolean
    }
    // 当前用户信息
    userInfo: {
        id: number
        avatar: string
        nickname: string
        identity: string
        status: string
        session?: number
    }
    // 当前会话信息
    sessionInfo: any
    // 当前会话聊天记录
    sessionRecords: {
        // 加载态
        loading: boolean
        // 数据
        data: any[]
        // 页码
        page: number
        // 是否有下一页
        nextPage: boolean
        // 聊天记录的所有用户的信息
        users: any
    }
    // 游客数据
    touristData: any[]
    // 会话列表数据
    sessionData: any[]
    // 右击菜单类型
    contextMenuType: string
    // 激活的游客会话
    activeTourist: number
    // 激活的会话
    activeSession: number
    // 激活的右侧操作tab
    activeOptTab: string
    // 会话的用户基础信息表单数据
    baseInfoForm: any
    // 用户轨迹数据
    trajectorys: {
        // 数据
        data: any[]
        // 页码
        page: number
        // 是否有下一页
        nextPage: boolean
        // 加载态
        loading: boolean
    }
    // 知识库数据
    kbs: {
        matchInput: string
        // 数据
        data: any[]
        // 加载态
        loading: boolean
    }
    // 对话邀请
    invitation: {
        show: boolean
        count: number
        timer: any
        disabled: boolean
    }
    quickReply: any[]
    // 对话对象输入状态
    sessionUserInputStatus: boolean
    // 意外获得的聊天记录计数（翻页时减去此数量，以免记录重复）
    unexpectedRecords: number
    // 当前 Tab 是否已经是一个独立的对话窗口标签页
    independentTab: boolean
    // Tab 模式:smallWindow=独立小窗,neWindow=独立新窗口
    tabMode: any
    // 会话转接窗口
    transfer: {
        show: boolean
        loading: boolean
        csrId: number
    }
    language: {
        current: string
        list: Array<{value: string, label: string}>
    }
}

export interface Stores {
    userInfo: any
    adminInfo: any
}

export interface Ring {
    context: AudioContext
    source: AudioBufferSourceNode | null
    buffer: AudioBuffer | null
    disabled: boolean
}

export interface Ws {
    timer: number | null
    ready: boolean
    errorMsg: SendWsMessage[]
    socketTask: WebSocket | null
    canConnect: boolean
    maxReconnectCount: number
    currentReconnectCount: number
    // 等待响应的ws消息列表
    awaitResponse: string[]
}

export interface Common {
    csrTab: Window | null
    userTab: Window | null
    messageInputRef: Ref<HTMLTextAreaElement | null>
    messageScrollbarRef: Ref<any>
    elMessageInstance: MessageHandler | null
    sessionsRef: Ref<HTMLDivElement | null>
    sessionsTimer: number | null
    notificationStatus: boolean
    intersectionObserver: IntersectionObserver
    intersectionObserverType: 'session' | 'tourist' | 'none'
}

export interface Hooks {
    initSuccess?: (ws: Ws, config: Config) => void
    connectionSuccess?: (ws: Ws, config: Config) => void
    userInitSuccess?: (userInfo: any) => void
    languageChanged?: (language: string) => void
}

export interface Config {
    app_name: string
    ws_url: string
    wss_switch: string
    websocket_port: string
    ring: string
    auto_invitation_switch: string
    auto_invitation_no_session: string
    auto_invitation_max: string
    auto_invitation_timing: string
    auto_invitation_bg: string
    sliders: string[]
    notice: string
    notice_theme: AlertProps['type']
    introduces: string
    new_user_tip: string
    input_status_display: string
    tourist_file_switch: string
    goods_api: string
    send_goods_identity: string[]
    orders_api: string
    send_orders_identity: string[]
    new_message_sound: string
    new_message_shake: string
    new_message_notification: string
    click_button_mode: string
    session_link_prod: string
    session_link_dev: string
}

export interface ReceivedWsMessage<T = anyObj> {
    type: string
    time: number
    path: string
    data: T
}

export interface SendWsMessage {
    pathInfo: string
    needResponse?: boolean
    [key: string]: any
}

/**
 * 语言包类型定义
 */
export interface Language {
    [key: string]: string
}
